import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        while (scanner.hasNext()){
            int row=scanner.nextInt();
            int col=scanner.nextInt();
            int k=scanner.nextInt();
            int[][] arr=new int[k][2];
            for(int i=0;i<k;i++){
                arr[i][0]=scanner.nextInt();
                arr[i][1]=scanner.nextInt();
            }
            double ret=find(arr,row,col);
            System.out.printf("%.2f",ret);
            System.out.println();
        }
    }
    public static double find(int[][] arr,int row,int col){
        double[][] map=new double[row+1][col+1];
        for(int[] a:arr){
            map[a[0]][a[1]]=-1;
        }
        map[1][1]=1;
        for(int i=1;i<=row;i++){
            for(int j=1;j<=col;j++){
                if(map[i][j]!=-1){
                    if(map[i-1][j]!=-1){
                        map[i][j] += j==col?map[i-1][j]:map[i-1][j]/2;
                    }
                    if(map[i][j-1]!=-1){
                        map[i][j] += i==row?map[i][j-1]:map[i][j-1]/2;
                    }
                }
            }
        }
        return map[row][col];
    }
}
















//import java.util.ArrayList;
//import java.util.List;
//import java.util.Scanner;
//
//public class Main {
//    public static int count=1;
//    public static void main(String[] args) {
//        Scanner scanner=new Scanner(System.in);
//        while (scanner.hasNext()){
//            int row=scanner.nextInt();
//            int col=scanner.nextInt();
//            List<String> list=new ArrayList<>();
//            for(int i=0;i<row;i++){
//                list.add(scanner.next());
//            }
//            dfs(list,x,y,row,col,spot,num);
//            System.out.println(count);
//        }
//    }
//    public static void dfs(int[][] arr,int x,int y,int row,int col,int spot,int num){
//        if(x<0||y<0||x>=row||y<=col||arr[x][y]!=spot){
//            return;
//        }
//        count++;
//        arr[x][y]=num;
//        dfs(arr,x+1,y,row,col,spot,num);
//        dfs(arr,x-1,y,row,col,spot,num);
//        dfs(arr,x,y+1,row,col,spot,num);
//        dfs(arr,x,y-1,row,col,spot,num);
//    }
//}















//import java.util.*;
//public class Main {
//    public static void main(String[] args) {
//        Scanner scan = new Scanner(System.in);
//        while (scan.hasNext()) {
//            int m = scan.nextInt();
//            int n = scan.nextInt();
//            scan.nextLine();
//            boolean map[][] = new boolean[m][n];
//            int si = -1;
//            int sj = -1;
//            for (int i = 0; i < m; i++) {
//                char[] temp = scan.nextLine().toCharArray();
//                for (int j = 0; j < n; j++) {
//                    if (temp[j] == '@') {
//                        map[i][j] = true;
//                        si = i;
//                        sj = j;
//                    } else if (temp[j] == '#') {
//                        map[i][j] = false;
//                    } else {
//                        map[i][j] = true;
//                    }
//                }
//            }
//            System.out.println(helper(map, si, sj));
//        }
//    }
//
//    public static int helper(boolean map[][], int si, int sj) {
//        boolean c[][] = new boolean[map.length][map[0].length];
//        Queue<Integer> qi = new LinkedList<Integer>();
//        Queue<Integer> qj = new LinkedList<Integer>();
//        qi.add(si);
//        qj.add(sj);
//        c[si][sj] = true;
//        while (!qi.isEmpty()) {
//            int i = qi.poll();
//            int j = qj.poll();
//            if (i - 1 >= 0 && map[i - 1][j] && !c[i - 1][j]) {
//                qi.add(i - 1);
//                qj.add(j);
//                c[i - 1][j] = true;
//            }
//            if (i + 1 < map.length && map[i + 1][j] && !c[i + 1][j]) {
//                qi.add(i + 1);
//                qj.add(j);
//                c[i + 1][j] = true;
//            }
//            if (j - 1 >= 0 && map[i][j - 1] && !c[i][j - 1]) {
//                qi.add(i);
//                qj.add(j - 1);
//                c[i][j - 1] = true;
//            }
//            if (j + 1 < map[0].length && map[i][j + 1] && !c[i][j + 1]) {
//                qi.add(i);
//                qj.add(j + 1);
//                c[i][j + 1] = true;
//            }
//        }
//        int count = 0;
//        for (int i = 0; i < map.length; i++) {
//            for (int j = 0; j < map[0].length; j++) {
//                if (c[i][j]) {
//                    count++;
//                }
//            }
//        }
//        return count;
//    }
//}